﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FrameworkLib.Facades;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Filters;
using LinqKit;

namespace GestionePolveriLib.Facades
{
    public class ScortaMinimaFacade : FacadeBase<GestionePolveriEntities>
    {
        GestionePolveriEntities context = null;

        public ScortaMinimaFacade()
        {
            context = this.GetContext();
        }

        public List<ScortaMinimaInfo> GetScortaMinimaInfo()
        {
            List<ScortaMinimaInfo> retValue = null;

            try
            {
                double nullValue = 0;

                //GestionePolveriEntities context = this.GetContext();
                var obj = from x in context.AnagPolveri
                          join ll in context.Lotti on x.IDPolvere equals ll.IDPolvere
                          group x by new { x.CodicePolvere, x.Descrizione, x.Note, x.ScortaMinima, x.IsCodiceCustom, x.IDFornitore, x.IDPolvere } into grp
                          orderby grp.Key.CodicePolvere
                          select new ScortaMinimaInfo
                          {
                              ID = grp.Key.IDPolvere,
                              CodicePolvere = grp.Key.CodicePolvere,
                              Descrizione = grp.Key.Descrizione,
                              Note = grp.Key.Note,
                              ScortaMinima = grp.Key.ScortaMinima,
                              Giacenza = (from l in context.Lotti where l.IDPolvere == grp.Key.IDPolvere select l.Giacenza).Sum(),
                              Valore = (from l in context.Lotti where l.IDPolvere == grp.Key.IDPolvere select l.Valore).Sum(),
                              Prezzo = (from l in context.Lotti where l.IDPolvere == grp.Key.IDPolvere orderby l.DataDdt descending select l.PrezzoUnitario).FirstOrDefault(),
                              Carico = (from m in context.Movimenti where ((m.IDPolvere == grp.Key.IDPolvere) && (m.CausaliMagazzino.CodCausale == "C")) select m.Quantita).Sum(),
                              Scarico = ((from m in context.Movimenti where ((m.IDPolvere == grp.Key.IDPolvere) && (m.CausaliMagazzino.CodCausale == "S")) select m.Quantita).Any() ?
                                         (from m in context.Movimenti where ((m.IDPolvere == grp.Key.IDPolvere) && (m.CausaliMagazzino.CodCausale == "S")) select m.Quantita).Sum() : 0),
                              IsCodiceCustom = grp.Key.IsCodiceCustom,
                              Fornitore = (from y in context.AnagFornitori
                                           where y.IDFornitore == grp.Key.IDFornitore
                                           select new Fornitore
                                           {
                                               ID = y.IDFornitore,
                                               Descrizione = y.Descrizione,
                                               Note = y.Note
                                           }).FirstOrDefault()
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                    LoadInformazioniAccessorie(retValue);
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<ScortaMinimaInfo> GetScortaMinimaInfo(FilterBase<AnagPolveri> filter)
        {
            List<ScortaMinimaInfo> retValue = null;

            try
            {
                //GestionePolveriEntities context = this.GetContext();
                var obj = from x in context.AnagPolveri.AsExpandable().Where(filter.SetUpFilter())
                          join ll in context.Lotti on x.IDPolvere equals ll.IDPolvere
                          group x by new { x.CodicePolvere, x.Descrizione, x.Note, x.ScortaMinima, x.IsCodiceCustom, x.IDFornitore, x.IDPolvere } into grp
                          orderby grp.Key.CodicePolvere
                          select new ScortaMinimaInfo
                          {
                              ID = grp.Key.IDPolvere,
                              CodicePolvere = grp.Key.CodicePolvere,
                              Descrizione = grp.Key.Descrizione,
                              Note = grp.Key.Note,
                              ScortaMinima = grp.Key.ScortaMinima,
                              Giacenza = (from l in context.Lotti where l.IDPolvere == grp.Key.IDPolvere select l.Giacenza).Sum(),
                              Valore = (from l in context.Lotti where l.IDPolvere == grp.Key.IDPolvere select l.Valore).Sum(),
                              Prezzo = (from l in context.Lotti where l.IDPolvere == grp.Key.IDPolvere orderby l.DataDdt descending select l.PrezzoUnitario).FirstOrDefault(),
                              Carico = (from m in context.Movimenti where ((m.IDPolvere == grp.Key.IDPolvere) && (m.CausaliMagazzino.CodCausale == "C")) select m.Quantita).Sum(),
                              Scarico = ((from m in context.Movimenti where ((m.IDPolvere == grp.Key.IDPolvere) && (m.CausaliMagazzino.CodCausale == "S")) select m.Quantita).Any() ?
                                         (from m in context.Movimenti where ((m.IDPolvere == grp.Key.IDPolvere) && (m.CausaliMagazzino.CodCausale == "S")) select m.Quantita).Sum() : 0),
                              IsCodiceCustom = grp.Key.IsCodiceCustom,
                              Fornitore = (from y in context.AnagFornitori
                                           where y.IDFornitore == grp.Key.IDFornitore
                                           select new Fornitore
                                           {
                                               ID = y.IDFornitore,
                                               Descrizione = y.Descrizione,
                                               Note = y.Note
                                           }).FirstOrDefault()
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                    LoadInformazioniAccessorie(retValue);
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        private void LoadInformazioniAccessorie(List<ScortaMinimaInfo> retValue)
        {
            List<LookUp_FamiglieColori_ColoriAbbinati_Result> mmm = (List<LookUp_FamiglieColori_ColoriAbbinati_Result>)FrameworkLib.Utilities.Singleton<GestionePolveriLib.Cache.LookUpData>.Instance.GetData("LookupFamiglie");
            foreach (Polvere p in retValue)
            {
                LookUp_FamiglieColori_ColoriAbbinati_Result r = mmm.Find(x => x.IDPolvere == p.ID);

                p.FamiglieColori = r.Famiglia;
                p.ColoriAbbinati = r.ColoriAbbinati;
                p.Applicazione = r.Applicazione;
            }
        }
    }
}
